{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Chapter 5 - Introduction to Neural Networks for Time Series Forecasting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import datetime as dt\n",
    "import os\n",
    "import warnings\n",
    "from collections import UserDict\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from common.utils import load_data, mape\n",
    "from IPython.display import Image\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "pd.options.display.float_format = \"{:,.2f}\".format\n",
    "np.set_printoptions(precision=2)\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 00:00:00</th>\n",
       "      <td>2,698.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 01:00:00</th>\n",
       "      <td>2,558.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 02:00:00</th>\n",
       "      <td>2,444.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 03:00:00</th>\n",
       "      <td>2,402.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 04:00:00</th>\n",
       "      <td>2,403.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        load\n",
       "2012-01-01 00:00:00 2,698.00\n",
       "2012-01-01 01:00:00 2,558.00\n",
       "2012-01-01 02:00:00 2,444.00\n",
       "2012-01-01 03:00:00 2,402.00\n",
       "2012-01-01 04:00:00 2,403.00"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_dir = \"data/\"\n",
    "ts_data_load = load_data(data_dir)[[\"load\"]]\n",
    "ts_data_load.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "valid_st_data_load = \"2014-09-01 00:00:00\"\n",
    "test_st_data_load = \"2014-11-01 00:00:00\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4kAAAH1CAYAAABbUbvGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd5xcVd0/8M9NkQ5SVVCfYM8DSIs8KoIgKEVBykMR0J8VBRXbgwQEC0VAICCdBJAIpBlCTSGQbBqpm7LJbrLJ7iab3c0m23vfmfP7Y8rembm9l8/bFy83M/feOXPn3nNP/R5JCAEiIiIiIiIiABjldwKIiIiIiIgoOFhJJCIiIiIioixWEomIiIiIiCiLlUQiIiIiIiLKYiWRiIiIiIiIslhJJCIiIiIioqwxfifAD0cddZQYN26c38kgIiIiIiLyxfr165uFEEcrvRfLSuK4ceNQXFzsdzKIiIiIiIh8IUnSbrX3ONyUiIiIiIiIslhJJCIiIiIioixWEomIiIiIiCgrlnMSiYiIiIgomIaGhlBXV4f+/n6/kxIJ+++/Pz7+8Y9j7NixhvdhJZGIiIiIiAKjrq4OhxxyCMaNGwdJkvxOTqgJIdDS0oK6ujocf/zxhvfjcFMiIiIiIgqM/v5+HHnkkawgOkCSJBx55JGme2VZSSQiIiIiokBhBdE5Vs4lK4lERERERERp7e3tePrpp03vd/HFF6O9vd2FFHmPlUQiIiIiIqI0tUri8PCw5n7z5s3Dhz/8YbeS5SkGriEiIiIiIkqbOHEiqqqqcMopp2Ds2LHYf//9cfjhh6O8vBw7duzAZZddhtraWvT39+M3v/kNbrzxRgDAuHHjUFxcjO7ublx00UX42te+hpUrV+K4447Dm2++iQMOOMDnb2YcK4lERERERBRIf3u7DFvrOx095n8feyj+cskJqu8/8MADKC0txaZNm7BkyRJ8+9vfRmlpaTY66IsvvogjjjgCfX19+NKXvoQrr7wSRx55ZM4xKioqMH36dEyZMgVXX301XnvtNdxwww2Ofg83sZJIRERERESk4owzzshZPuLxxx/H66+/DgCora1FRUVFQSXx+OOPxymnnAIAOP3001FdXe1Zep3ASiIREREREQWSVo+fVw466KDs30uWLMH777+PVatW4cADD8Q555yjuLzEfvvtl/179OjR6Ovr8yStTmHgGiIiIiIiorRDDjkEXV1diu91dHTg8MMPx4EHHojy8nKsXr3a49R5gz2JREREREREaUceeSTOPPNMnHjiiTjggAPwkY98JPvehRdeiGeffRbjx4/H5z//eXz5y1/2MaXukYQQfqfBcxMmTBDFxcV+J4OIiIiIiPJs27YN48eP9zsZkaJ0TiVJWi+EmKC0PYebEhERERERURYriURERCHw8qpqjJs4F539Q34nhYiIIo6VRCIiohB4fsUuAEBL96DPKSEioqhjJZGIiCgEhoaTAICxoyWfU0JERFHHSiIREVEIDCVTgebGjuajm4iI3MUnDRERUQgMJ1I9iRI7EomIyGWsJBIREYVJ/FauIiIKtIMPPhgAUF9fj//93/9V3Oacc86B3hJ8jz32GHp7e7P/vvjii9He3u5cQk1gJZGIiCjgxk2ci7beVFRT1hGJiILp2GOPxezZsy3vn19JnDdvHj784Q87kTTTWEkkIiIKEcFaIhGRqyZOnIinnnoq+++//vWvuPfee3HeeefhtNNOw0knnYQ333yzYL/q6mqceOKJAIC+vj5ce+21GD9+PC6//HL09fVlt7vpppswYcIEnHDCCfjLX/4CAHj88cdRX1+Pc889F+eeey4AYNy4cWhubgYATJo0CSeeeCJOPPFEPPbYY9nPGz9+PH72s5/hhBNOwLe+9a2cz7FjjCNHISIiIscNDiexpz33gS/Yl0hEcTJ/IrBvi7PH/OhJwEUPqL59zTXX4Le//S1++ctfAgBmzZqFd999F7fccgsOPfRQNDc348tf/jIuvfRSSCoTxZ955hkceOCB2LZtGzZv3ozTTjst+959992HI444AolEAueddx42b96MW265BZMmTUJRURGOOuqonGOtX78e//rXv7BmzRoIIfA///M/+PrXv47DDz8cFRUVmD59OqZMmYKrr74ar732Gm644Qbbp4g9iURERAF1+5wtOPfhJTmvsSeRiMhdp556KhobG1FfX4+SkhIcfvjh+OhHP4o77rgDX/ziF3H++edjz549aGhoUD3GsmXLspW1L37xi/jiF7+YfW/WrFk47bTTcOqpp6KsrAxbt27VTM+KFStw+eWX46CDDsLBBx+MK664AsuXLwcAHH/88TjllFMAAKeffjqqq6ttfvsU9iQSEREF1LKKpoLX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fOLnZ83O9emfQUQ+OnhuJ65bNyXoYhARERHltWzOJP4YwGgAq6SUX6gevx3AWCHEzkKIUgBnAHhKFXjmBgCnCSHqhBBdADYAuN7iuUQUISevGI0FXU1BF4OIiIgor2UrT2IHgIMBTADwjhDi08R/e0kp3wewM4DzAWwBMA3AWtXpZyIejOY1AA8A+LaU8m4AsHAuERERERER2SCklEGXIet6e3vlY489FnQxiIiIiIiIAiGE+LuUslfvuUBSYBAREREREVE4sZNIRERERERESewkEhERERERURI7iURERERERJTETiIRERERERElsZNIRERERERESewkEhERERERURI7iURERERERJTETiIRERERERElsZNIRERERERESewkEhERERERURI7iURERERERJTETiIRERERERElsZNIRERERERESewkEhERERERURI7iURERERERJQkpJRBlyHrhBCfAHjBx5eoAfBRhK6bjevz2rl3fV5b3wAAH/h4fT/KH9XPYVTL7fe1/b5+VK/t9/WjXLdE8Tsa1Wv7fX2WPfvX9vv6fl57lJSySvcZKWXe/QfgMZ+vf2WUrpuN6/PauXd9Xtvw+pGrX6L6OYxquVl2/l0cXt+3uiWK39GoXptlz71rR7nsmeoVLjf1x50Ru242rs9r5971ee1g+FH+qH4Oo1puv6/t9/Wjem2/rx/luiWK39GoXtvv67Ps2b+239cPpG7J1+Wmj0kpe4MuBxHlHtYvROQH1i1E5LVM9Uq+ziReGXQBiChnsX4hIj+wbiEirxnWK3k5k0jklBDiegBvSilPC7osRJQ7WLcQkR9Yt5BT+TqTSJRCCHG/EOLAoMtBRLmFdQsR+YF1C/mNnUQiIiIiIiJKyslOIkdXyCkhxDohxIOax6QQYnhQZaJwYf1CTrBuITOsW8gJ1i3kl5zsJBIREREREZEzOd1JFELUCSHuEkK8L4TYkvi5TfX8/UKIc4UQDwkhPhFC3COEGBBkmYkoGli/EJEfWLcQURjkdCcR8X/fdQA6ALQD+ALADzTH7AlgfwBNAIoBfCubBSSiyGL9QkR+YN1CRIErDLoAfpJSfgjgVuV3IcT5AO7THHadlPLFxPO/ArBD9kpIIfQZgHLlFyFES4BloRBj/UI2sW4hS1i3kE2sW8gXOT2TKIQoF0L8RAjxmhDiYwB/BlArhChQ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\n",
      "text/plain": [
       "<Figure size 1080x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ts_data_load[ts_data_load.index < valid_st_data_load][[\"load\"]].rename(columns={\"load\": \"train\"}).join(\n",
    "    ts_data_load[(ts_data_load.index >= valid_st_data_load) & (ts_data_load.index < test_st_data_load)][\n",
    "        [\"load\"]\n",
    "    ].rename(columns={\"load\": \"validation\"}),\n",
    "    how=\"outer\",\n",
    ").join(\n",
    "    ts_data_load[test_st_data_load:][[\"load\"]].rename(columns={\"load\": \"test\"}), how=\"outer\"\n",
    ").plot(\n",
    "    y=[\"train\", \"validation\", \"test\"], figsize=(15, 8), fontsize=12\n",
    ")\n",
    "plt.xlabel(\"timestamp\", fontsize=12)\n",
    "plt.ylabel(\"load\", fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load_original</th>\n",
       "      <th>y_t+1</th>\n",
       "      <th>load_t-5</th>\n",
       "      <th>load_t-4</th>\n",
       "      <th>load_t-3</th>\n",
       "      <th>load_t-2</th>\n",
       "      <th>load_t-1</th>\n",
       "      <th>load_t</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 05:00:00</th>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 06:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 07:00:00</th>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 08:00:00</th>\n",
       "      <td>0.29</td>\n",
       "      <td>0.35</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 09:00:00</th>\n",
       "      <td>0.35</td>\n",
       "      <td>0.37</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "      <td>0.35</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load_original  y_t+1  load_t-5  load_t-4  load_t-3  \\\n",
       "2012-01-01 05:00:00           0.15   0.18      0.22      0.18      0.14   \n",
       "2012-01-01 06:00:00           0.18   0.23      0.18      0.14      0.13   \n",
       "2012-01-01 07:00:00           0.23   0.29      0.14      0.13      0.13   \n",
       "2012-01-01 08:00:00           0.29   0.35      0.13      0.13      0.15   \n",
       "2012-01-01 09:00:00           0.35   0.37      0.13      0.15      0.18   \n",
       "\n",
       "                     load_t-2  load_t-1  load_t  \n",
       "2012-01-01 05:00:00      0.13      0.13    0.15  \n",
       "2012-01-01 06:00:00      0.13      0.15    0.18  \n",
       "2012-01-01 07:00:00      0.15      0.18    0.23  \n",
       "2012-01-01 08:00:00      0.18      0.23    0.29  \n",
       "2012-01-01 09:00:00      0.23      0.29    0.35  "
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "T = 6\n",
    "HORIZON = 1\n",
    "train = ts_data_load.copy()[ts_data_load.index < valid_st_data_load][[\"load\"]]\n",
    "\n",
    "scaler = MinMaxScaler()\n",
    "train[\"load\"] = scaler.fit_transform(train)\n",
    "\n",
    "train_shifted = train.copy()\n",
    "train_shifted[\"y_t+1\"] = train_shifted[\"load\"].shift(-1, freq=\"H\")\n",
    "for t in range(1, T + 1):\n",
    "    train_shifted[str(T - t)] = train_shifted[\"load\"].shift(T - t, freq=\"H\")\n",
    "y_col = \"y_t+1\"\n",
    "X_cols = [\"load_t-5\", \"load_t-4\", \"load_t-3\", \"load_t-2\", \"load_t-1\", \"load_t\"]\n",
    "train_shifted.columns = [\"load_original\"] + [y_col] + X_cols\n",
    "\n",
    "train_shifted = train_shifted.dropna(how=\"any\")\n",
    "train_shifted.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "lines_to_next_cell": 0
   },
   "outputs": [],
   "source": [
    "y_train = train_shifted[y_col].to_numpy()\n",
    "X_train = train_shifted[X_cols].to_numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = X_train.reshape(X_train.shape[0], T, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(23370,)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.18, 0.23, 0.29])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(23370, 6, 1)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[0.22],\n",
       "        [0.18],\n",
       "        [0.14],\n",
       "        [0.13],\n",
       "        [0.13],\n",
       "        [0.15]],\n",
       "\n",
       "       [[0.18],\n",
       "        [0.14],\n",
       "        [0.13],\n",
       "        [0.13],\n",
       "        [0.15],\n",
       "        [0.18]],\n",
       "\n",
       "       [[0.14],\n",
       "        [0.13],\n",
       "        [0.13],\n",
       "        [0.15],\n",
       "        [0.18],\n",
       "        [0.23]]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load_original</th>\n",
       "      <th>y_t+1</th>\n",
       "      <th>load_t-5</th>\n",
       "      <th>load_t-4</th>\n",
       "      <th>load_t-3</th>\n",
       "      <th>load_t-2</th>\n",
       "      <th>load_t-1</th>\n",
       "      <th>load_t</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 05:00:00</th>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 06:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 07:00:00</th>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load_original  y_t+1  load_t-5  load_t-4  load_t-3  \\\n",
       "2012-01-01 05:00:00           0.15   0.18      0.22      0.18      0.14   \n",
       "2012-01-01 06:00:00           0.18   0.23      0.18      0.14      0.13   \n",
       "2012-01-01 07:00:00           0.23   0.29      0.14      0.13      0.13   \n",
       "\n",
       "                     load_t-2  load_t-1  load_t  \n",
       "2012-01-01 05:00:00      0.13      0.13    0.15  \n",
       "2012-01-01 06:00:00      0.13      0.15    0.18  \n",
       "2012-01-01 07:00:00      0.15      0.18    0.23  "
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_shifted.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "      <th>y+1</th>\n",
       "      <th>load_t-5</th>\n",
       "      <th>load_t-4</th>\n",
       "      <th>load_t-3</th>\n",
       "      <th>load_t-2</th>\n",
       "      <th>load_t-1</th>\n",
       "      <th>load_t-0</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2014-09-01 00:00:00</th>\n",
       "      <td>0.28</td>\n",
       "      <td>0.24</td>\n",
       "      <td>0.61</td>\n",
       "      <td>0.58</td>\n",
       "      <td>0.51</td>\n",
       "      <td>0.43</td>\n",
       "      <td>0.34</td>\n",
       "      <td>0.28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-09-01 01:00:00</th>\n",
       "      <td>0.24</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.58</td>\n",
       "      <td>0.51</td>\n",
       "      <td>0.43</td>\n",
       "      <td>0.34</td>\n",
       "      <td>0.28</td>\n",
       "      <td>0.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-09-01 02:00:00</th>\n",
       "      <td>0.22</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.51</td>\n",
       "      <td>0.43</td>\n",
       "      <td>0.34</td>\n",
       "      <td>0.28</td>\n",
       "      <td>0.24</td>\n",
       "      <td>0.22</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load  y+1  load_t-5  load_t-4  load_t-3  load_t-2  \\\n",
       "2014-09-01 00:00:00  0.28 0.24      0.61      0.58      0.51      0.43   \n",
       "2014-09-01 01:00:00  0.24 0.22      0.58      0.51      0.43      0.34   \n",
       "2014-09-01 02:00:00  0.22 0.22      0.51      0.43      0.34      0.28   \n",
       "\n",
       "                     load_t-1  load_t-0  \n",
       "2014-09-01 00:00:00      0.34      0.28  \n",
       "2014-09-01 01:00:00      0.28      0.24  \n",
       "2014-09-01 02:00:00      0.24      0.22  "
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "look_back_dt = dt.datetime.strptime(valid_st_data_load, \"%Y-%m-%d %H:%M:%S\") - dt.timedelta(\n",
    "    hours=T - 1\n",
    ")\n",
    "valid = ts_data_load.copy()[(ts_data_load.index >= look_back_dt) & (ts_data_load.index < test_st_data_load)][\n",
    "    [\"load\"]\n",
    "]\n",
    "\n",
    "valid[\"load\"] = scaler.transform(valid)\n",
    "\n",
    "valid_shifted = valid.copy()\n",
    "valid_shifted[\"y+1\"] = valid_shifted[\"load\"].shift(-1, freq=\"H\")\n",
    "for t in range(1, T + 1):\n",
    "    valid_shifted[\"load_t-\" + str(T - t)] = valid_shifted[\"load\"].shift(T - t, freq=\"H\")\n",
    "\n",
    "valid_shifted = valid_shifted.dropna(how=\"any\")\n",
    "valid_shifted.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'Series' object has no attribute 'as_matrix'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-27-c60a26b6122c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my_valid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvalid_shifted\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"y+1\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_matrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mX_valid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvalid_shifted\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"load_t-\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mT\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mT\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_matrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mX_valid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mX_valid\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_valid\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/anaconda/envs/azureml_py36/lib/python3.6/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m   5134\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_can_hold_identifiers_and_holds_name\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   5135\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5136\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   5137\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   5138\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mAttributeError\u001b[0m: 'Series' object has no attribute 'as_matrix'"
     ]
    }
   ],
   "source": [
    "y_valid = valid_shifted[\"y+1\"].as_matrix()\n",
    "X_valid = valid_shifted[[\"load_t-\" + str(T - t) for t in range(1, T + 1)]].as_matrix()\n",
    "X_valid = X_valid.reshape(X_valid.shape[0], T, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'y_valid' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-13-438e1c340f99>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my_valid\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m: name 'y_valid' is not defined"
     ]
    }
   ],
   "source": [
    "y_valid.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_valid[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_valid.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_valid[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.callbacks import EarlyStopping\n",
    "from tensorflow.keras.layers import GRU, Dense\n",
    "from tensorflow.keras.models import Model, Sequential"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "LATENT_DIM = 5\n",
    "BATCH_SIZE = 32\n",
    "EPOCHS = (\n",
    "    10\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = Sequential()\n",
    "model.add(GRU(LATENT_DIM, input_shape=(T, 1)))\n",
    "model.add(Dense(HORIZON))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(optimizer=\"RMSprop\", loss=\"mse\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "earlystop = EarlyStopping(monitor=\"val_loss\", min_delta=0, patience=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model_history = model.fit(\n",
    "    X_train,\n",
    "    y_train,\n",
    "    batch_size=BATCH_SIZE,\n",
    "    epochs=EPOCHS,\n",
    "    validation_data=(X_valid, y_valid),\n",
    "    callbacks=[earlystop],\n",
    "    verbose=1,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "look_back_dt = dt.datetime.strptime(test_st_data_load, \"%Y-%m-%d %H:%M:%S\") - dt.timedelta(\n",
    "    hours=T - 1\n",
    ")\n",
    "test = ts_data_load.copy()[test_st_data_load:][[\"load\"]]\n",
    "\n",
    "test[\"load\"] = scaler.transform(test)\n",
    "\n",
    "test_shifted = test.copy()\n",
    "test_shifted[\"y_t+1\"] = test_shifted[\"load\"].shift(-1, freq=\"H\")\n",
    "for t in range(1, T + 1):\n",
    "    test_shifted[\"load_t-\" + str(T - t)] = test_shifted[\"load\"].shift(T - t, freq=\"H\")\n",
    "\n",
    "test_shifted = test_shifted.dropna(how=\"any\")\n",
    "\n",
    "y_test = test_shifted[\"y_t+1\"].as_matrix()\n",
    "X_test = test_shifted[[\"load_t-\" + str(T - t) for t in range(1, T + 1)]].as_matrix()\n",
    "X_test = X_test.reshape(X_test.shape[0], T, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ts_predictions = model.predict(X_test)\n",
    "ts_predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ev_ts_data = pd.DataFrame(\n",
    "    ts_predictions, columns=[\"t+\" + str(t) for t in range(1, HORIZON + 1)]\n",
    ")\n",
    "ev_ts_data[\"timestamp\"] = test_shifted.index\n",
    "ev_ts_data = pd.melt(ev_ts_data, id_vars=\"timestamp\", value_name=\"prediction\", var_name=\"h\")\n",
    "ev_ts_data[\"actual\"] = np.transpose(y_test).ravel()\n",
    "ev_ts_data[[\"prediction\", \"actual\"]] = scaler.inverse_transform(\n",
    "    ev_ts_data[[\"prediction\", \"actual\"]]\n",
    ")\n",
    "ev_ts_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def mape(ts_predictions, actuals):\n",
    "    \"\"\"Mean absolute percentage error\"\"\"\n",
    "    return ((ts_predictions - actuals).abs() / actuals).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "mape(ev_ts_data[\"prediction\"], ev_ts_data[\"actual\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ev_ts_data[ev_ts_data.timestamp < \"2014-11-08\"].plot(\n",
    "    x=\"timestamp\", y=[\"prediction\", \"actual\"], style=[\"r\", \"b\"], figsize=(15, 8)\n",
    ")\n",
    "plt.xlabel(\"timestamp\", fontsize=12)\n",
    "plt.ylabel(\"load\", fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Multivariate model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "lines_to_next_cell": 0
   },
   "outputs": [],
   "source": [
    "import datetime as dt\n",
    "import os\n",
    "import sys\n",
    "import warnings\n",
    "from collections import UserDict\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from common.utils import TimeSeriesTensor, create_evaluation_df, load_data, mape\n",
    "from IPython.display import Image\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "pd.options.display.float_format = \"{:,.2f}\".format\n",
    "np.set_printoptions(precision=2)\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "      <th>temp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 00:00:00</th>\n",
       "      <td>2,698.00</td>\n",
       "      <td>32.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 01:00:00</th>\n",
       "      <td>2,558.00</td>\n",
       "      <td>32.67</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 02:00:00</th>\n",
       "      <td>2,444.00</td>\n",
       "      <td>30.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 03:00:00</th>\n",
       "      <td>2,402.00</td>\n",
       "      <td>31.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 04:00:00</th>\n",
       "      <td>2,403.00</td>\n",
       "      <td>32.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        load  temp\n",
       "2012-01-01 00:00:00 2,698.00 32.00\n",
       "2012-01-01 01:00:00 2,558.00 32.67\n",
       "2012-01-01 02:00:00 2,444.00 30.00\n",
       "2012-01-01 03:00:00 2,402.00 31.00\n",
       "2012-01-01 04:00:00 2,403.00 32.00"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_dir = \"./data/\"\n",
    "ts_data = load_data(data_dir)\n",
    "ts_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "valid_st_data_load = \"2014-09-01 00:00:00\"\n",
    "test_st_data_load = \"2014-11-01 00:00:00\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "lines_to_next_cell": 0
   },
   "outputs": [],
   "source": [
    "T = 6\n",
    "HORIZON = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MinMaxScaler(copy=True, feature_range=(0, 1))"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scaler = MinMaxScaler()\n",
    "y_scaler.fit(train[[\"load\"]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = ts_data.copy()[ts_data.index < valid_st_data_load][[\"load\", \"temp\"]]\n",
    "X_scaler = MinMaxScaler()\n",
    "train[[\"load\", \"temp\"]] = X_scaler.fit_transform(train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "      <th>temp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 00:00:00</th>\n",
       "      <td>0.22</td>\n",
       "      <td>0.42</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 01:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 02:00:00</th>\n",
       "      <td>0.14</td>\n",
       "      <td>0.40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 03:00:00</th>\n",
       "      <td>0.13</td>\n",
       "      <td>0.41</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 04:00:00</th>\n",
       "      <td>0.13</td>\n",
       "      <td>0.42</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load  temp\n",
       "2012-01-01 00:00:00  0.22  0.42\n",
       "2012-01-01 01:00:00  0.18  0.43\n",
       "2012-01-01 02:00:00  0.14  0.40\n",
       "2012-01-01 03:00:00  0.13  0.41\n",
       "2012-01-01 04:00:00  0.13  0.42"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "tensor_structure = {\"X\": (range(-T + 1, 1), [\"load\", \"temp\"])}\n",
    "ts_train_inp = TimeSeriesTensor(\n",
    "    dataset=train,\n",
    "    target=\"load\",\n",
    "    H=HORIZON,\n",
    "    tensor_structure=tensor_structure,\n",
    "    freq=\"H\",\n",
    "    drop_incomplete=True,\n",
    ")\n",
    "back_ts_data = dt.datetime.strptime(valid_st_data_load, \"%Y-%m-%d %H:%M:%S\") - dt.timedelta(\n",
    "    hours=T - 1\n",
    ")\n",
    "valid = ts_data.copy()[(ts_data.index >= back_ts_data) & (ts_data.index < test_st_data_load)][\n",
    "    [\"load\", \"temp\"]\n",
    "]\n",
    "valid[[\"load\", \"temp\"]] = X_scaler.transform(valid)\n",
    "valid_inputs = TimeSeriesTensor(valid, \"load\", HORIZON, tensor_structure)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.callbacks import EarlyStopping\n",
    "from tensorflow.keras.layers import GRU, Dense\n",
    "from tensorflow.keras.models import Model, Sequential"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "LATENT_DIM = 5\n",
    "BATCH_SIZE = 32\n",
    "EPOCHS = 50\n",
    "\n",
    "model = Sequential()\n",
    "model.add(GRU(LATENT_DIM, input_shape=(T, 2)))\n",
    "model.add(Dense(HORIZON))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "gru (GRU)                    (None, 5)                 135       \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 1)                 6         \n",
      "=================================================================\n",
      "Total params: 141\n",
      "Trainable params: 141\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.compile(optimizer=\"RMSprop\", loss=\"mse\")\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "earlystop = EarlyStopping(monitor=\"val_loss\", min_delta=0, patience=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model_history = model.fit(\n",
    "    ts_train_inp[\"X\"],\n",
    "    ts_train_inp[\"target\"],\n",
    "    batch_size=BATCH_SIZE,\n",
    "    epochs=EPOCHS,\n",
    "    validation_data=(valid_inputs[\"X\"], valid_inputs[\"target\"]),\n",
    "    callbacks=[earlystop],\n",
    "    verbose=1,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "back_ts_data = dt.datetime.strptime(ts_data_test_st_data_load, \"%Y-%m-%d %H:%M:%S\") - dt.timedelta(\n",
    "    hours=T - 1\n",
    ")\n",
    "ts_data_test = ts_data.copy()[ts_data_test_st_data_load:][[\"load\", \"temp\"]]\n",
    "ts_data_test[[\"load\", \"temp\"]] = X_scaler.transform(ts_data_test)\n",
    "ts_data_test_inputs = TimeSeriesTensor(ts_data_test, \"load\", HORIZON, tensor_structure)\n",
    "\n",
    "ts_predictions = model.predict(ts_data_test_inputs[\"X\"])\n",
    "\n",
    "ev_ts_data = create_evaluation_df(ts_predictions, ts_data_test_inputs, HORIZON, y_scaler)\n",
    "ev_ts_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "mape(ev_ts_data[\"prediction\"], ev_ts_data[\"actual\"])"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "formats": "ipynb,py:light"
  },
  "kernel_info": {
   "name": "python3"
  },
  "kernelspec": {
   "display_name": "Python 3.6 - AzureML",
   "language": "python",
   "name": "python3-azureml"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  },
  "nteract": {
   "version": "nteract-front-end@1.0.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
